package 翻译程序;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.HashMap;

public class UdpDictServer {
    DatagramSocket socket=null;
    private HashMap<String,String> dict=new HashMap<>();

    //port 表示端口号
    //服务器在启动时，需要关联绑定 一个端口号
    //收到数据时，根据传入的端口号决定把这个数据交给哪个进程。
    //虽然我们指定端口号为int，但实际上端口号是两个字节的数据，范围为0~65535
    public UdpDictServer(int port) throws SocketException {
        socket=new DatagramSocket(port);

        //对 hash表的值进行初始化
        dict.put("hello","你好");
        dict.put("cat","🐱");
        dict.put("sun","☀");
    }

    public void start() throws IOException {
        System.out.println("服务器启动！");
        while (true) {
            //1.读取请求并解析
            DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);//空数据报
            socket.receive(requestPacket);
            //socket.receive(requestPacket)中receive读取请求时，得到的结果并没有作为返回值，而是作为一个 输出型参数，设置到参数DatagramPacket的对象中
            String request=new String(requestPacket.getData(),0,requestPacket.getLength());

            //2.根据请求计算响应
            String response=process(request);

            //3.将响应写回到客户端
            DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),
                    response.getBytes().length,
                    requestPacket.getSocketAddress());//构造response数据报:字节数组 + 数组大小 + 请求数据报从哪里来(作为响应数据报的目的IP和目的端口)

            //将响应发送
            socket.send(responsePacket);

            //打印日志
            String log=String.format("[%s : %d] ; request:%s , response:%s",
                    requestPacket.getAddress().toString(),
                    requestPacket.getPort(),
                    request,
                    response);
            System.out.println(log);//getAddress()得到请求方的IP，getPort()得到请求方的端口号
        }
    }

    private String process(String request) {
        //根据请求计算响应，需要实现英文变中文，例如 hello->你好
        //实现这个逻辑的核心就是 查表
        //专业词典，是将数据存入数据库，查数据库中的表
        //这里，我们进行简化，直接查找 内存的hash表
        return dict.getOrDefault(request,"词典未收入该词汇");
        //使用 getOrDefault，request为key,key存在则返回对应的value，如果key不存在，给客户端一个指定的提示。
        //如果使用 get,当key不存在，返回的是null

    }

    public static void main(String[] args) throws IOException {
        UdpDictServer server=new UdpDictServer(9090);
        server.start();
    }
}
